<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    var myObj = { name:'我是前端bug开发攻城狮' } 
    function myFunc(name,age, a){ 
      console.log('argument.name===',name) 
      console.log('this.name：age==',this.name,':',age, a) 
    }
    Function.prototype.myBind = function(context) {
      context = context || window
      // this是指调用的对象，这里只myFunc
      context.fn = this
      let args = [...arguments].splice(1)
      let result = function() {
      	console.log(this)
      	// 这里的this指的是window
      	return context.fn.apply(
      		this instanceof context.fn ? this : context,
      		[...args, ...arguments]
      		// args.concat(...arguments)
  		)
      	// args.concat(...arguments)
       //  context.fn(...args)
      }
      return result
    }
    myFunc.myBind(myObj,'路人甲',100)('aaa')

    // Function.prototype.myBind = function(context, ...list) {
    //   let self = this; // 目标函数
      
    //   // 自己实现的bind函数，如果把返回的新函数当成了构造函数，此时会遇到问题，
    //   // 就是找不到目标函数原型上的方法
    //   // 解决：让新函数继承目标函数的原型
    //   let Bound = function(...arg2){
    //     self.apply(context, [...list,...arg2])
    //   }
    //   // 以某个对象作为原型创建一个新的对象出来
    //   Bound.prototype = this.prototype;
    //   // Bound.prototype.custructor = self;
    //   console.log(Bound)
    //   return Bound;
    // }
  </script>
</body>
</html>